#ifdef _RMS_TOML_

#include "rc4.h"

// === RC4 cipher ===

RC4::RC4(RC4Key key)
{
  int i, j, k, a;
  S.x = 0; S.y = 0;
  for(i = 0; i < 256; i++)
    S.m[i] = i;
  j = k = 0;
  for(i = 0; i < 256; i++)
  {
    a = S.m[i];
    j = (BYTE)(j+a+key.data[k]);
    S.m[i]=S.m[j]; S.m[j]=a;
    if(++k>=key.length) k=0;
  }
  for(i=0; i<InitCount; i++) GetByte();
}

void RC4::Encode(BYTE* data, int length)
{ 
  int i, a, b;
  for(i = 0; i<length; i++)
  {
    S.x = (BYTE)(S.x+1); a = S.m[S.x];
    S.y = (BYTE)(S.y+a);
    S.m[S.x] = b = S.m[S.y];
    S.m[S.y] = a;
    data[i] ^= S.m[(BYTE)(a+b)]; // XOR
  }
}

BYTE RC4::GetByte()
{
  int a, b;
  S.x = (BYTE)(S.x+1); a = S.m[S.x];
  S.y = (BYTE)(S.y+a);
  S.m[S.x] = b = S.m[S.y];
  S.m[S.y] = a;
  return S.m[(BYTE)(a+b)];
}


#endif